package test.sunyu.kit.mina;

import org.junit.Test;
import org.slf4j.Logger;
import sunyu.kit.common.*;
import sunyu.kit.mina.SocketClient;

import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * @author 孙宇
 */
public class 国标过检测试使用现有报文 {

    private static final Logger logger = LogKit.getLogger();

    String WEB_SESSION = "06201A3CC575A621E0C80C1DA3AC01BC";

    int loginNum = 1;//登入登出流水号

    String loginName = "hzplgqc00000";
    String loginPassword = "plg-01@0000000000000";
    String vin = "LB91CKAA7F1WNZ027";
    String did = "homer123456789013";
    String ICCID = "89860010648203989290";

    String 国标网关IP = "218.205.176.44";
    int 国标网关端口 = 19007;
    String 公司转发网关IP = "192.168.11.109";
    int 公司转发网关端口 = 19006;

    String 报警url = 国标过检测试使用现有报文.class.getResource("/BaoJing.txt").getPath().substring(1);
    String 充电url = 国标过检测试使用现有报文.class.getResource("/ChongDian.txt").getPath().substring(1);
    String 行驶url = 国标过检测试使用现有报文.class.getResource("/XingShi.txt").getPath().substring(1);

    @Test
    public void 一次执行7个方法() throws IOException, InterruptedException {
        平台登入登出5次();
        TimeUnit.SECONDS.sleep(5);
        车辆登入登出5次();
        TimeUnit.SECONDS.sleep(5);
        行驶数据发送15分钟以上();
        TimeUnit.SECONDS.sleep(5);
        充电数据发送15分钟以上();
        TimeUnit.SECONDS.sleep(5);
        发送报警数据();
        TimeUnit.MINUTES.sleep(11);
        发送车辆补发数据();
        TimeUnit.MINUTES.sleep(11);
        发送平台补发数据();
        TimeUnit.SECONDS.sleep(1);
        合并日志();
    }

    @Test
    public void 合并日志() throws IOException {
        List<String> fileNameList = Arrays.asList("D:/平台登入登出5次.log", "D:/车辆登入登出5次.log", "D:/行驶数据发送15分钟以上.log"
                , "D:/充电数据发送15分钟以上.log", "D:/报警数据.log", "D:/车辆补发.log", "D:/平台补发.log");

        File log = new File("D:/日志.log");
        FileKit.deleteFile(log);
        FileKit.createNewFile(log);

        File log2 = new File("D:/日志时间段.log");
        FileKit.deleteFile(log2);
        FileKit.createNewFile(log2);

        for (String fileName : fileNameList) {
            File f = new File(fileName);
            List<String> line = FileKit.readLines(f);

            String content = fileName.substring(fileName.indexOf("/") + 1, fileName.indexOf("."));
            content += "  ";
            content += line.get(0).substring(1, 20);
            content += " 至 ";
            content += line.get(line.size() - 3).substring(1, 20);
            FileKit.appendContentAndRN(log2, content);

            for (String s : line) {
                FileKit.appendContentAndRN(log, s);
            }
        }
    }

    @Test
    public void 读报文() {
        File f = new File(报警url);
        List<String> line = FileKit.readLines(f);
        Collections.reverse(line);
        for (String str : line) {
            if (str.indexOf("232302FE") > -1) {
                String bw = str.substring(str.indexOf("\t") + 1).trim();
                logger.debug(bw);
            }
        }
    }

    @Test
    public void 重新拼装报文() {
        String hexString = "232301FE686F6D657231323334353637383930313301001E11010B092714000338393836303031303634383230333938393239300000BA";
        byte[] bytes = new byte[0];
        报文结构 bw = ProtocolKit.获得报文结构(hexString);
        logger.debug("{}", bw.起始符);
        bytes = ByteKit.byteMerger(bytes, bw.起始符);
        logger.debug("{}", bw.命令标识);
        bytes = ByteKit.byteMerger(bytes, bw.命令标识);
        logger.debug("{}", bw.应答标识);
        bytes = ByteKit.byteMerger(bytes, bw.应答标识);
        logger.debug("{}", bw.唯一识别码);
        bytes = ByteKit.byteMerger(bytes, bw.唯一识别码);
        logger.debug("{}", bw.数据单元加密方式);
        bytes = ByteKit.byteMerger(bytes, bw.数据单元加密方式);
        logger.debug("{}", bw.数据单元长度);
        bytes = ByteKit.byteMerger(bytes, bw.数据单元长度);
        logger.debug("{}", bw.数据单元.实时信息上报.数据采集时间);
        bytes = ByteKit.byteMerger(bytes, bw.数据单元.实时信息上报.数据采集时间);
        logger.debug("{}", bw.数据单元.实时信息上报.cans);
        bytes = ByteKit.byteMerger(bytes, bw.数据单元.实时信息上报.cans);

        bytes = ProtocolKit.BBC(bytes);

        logger.debug("{}", StringKit.bytes2hexString(bytes));
    }

    @Test
    public void 平台登入登出5次() throws InterruptedException, IOException {
        File f = new File("D:/平台登入登出5次.log");
        FileKit.deleteFile(f);
        FileKit.createNewFile(f);

        SocketClient client = new ProtocolSocketClient(国标网关IP, 国标网关端口, f);//直接往国标网关发送

        for (int i = 1; i <= 5; i++) {
            loginNum = 平台登入(f, client, loginNum);
            TimeUnit.SECONDS.sleep(5);

            loginNum = 平台登出(f, client, loginNum);
            TimeUnit.SECONDS.sleep(5);

            loginNum++;
        }
        TimeUnit.SECONDS.sleep(1);
    }

    @Test
    public void 车辆登入登出5次() throws IOException, InterruptedException {
        File f = new File("D:/车辆登入登出5次.log");
        FileKit.deleteFile(f);
        FileKit.createNewFile(f);

        SocketClient client = new ProtocolSocketClient(公司转发网关IP, 公司转发网关端口, f);//往软件公司网关发送

        for (int i = 1; i <= 5; i++) {
            loginNum = 车辆登入(f, client, loginNum);
            TimeUnit.SECONDS.sleep(5);

            loginNum = 车辆登出(f, client, loginNum);
            TimeUnit.SECONDS.sleep(5);

            loginNum++;
        }
        TimeUnit.SECONDS.sleep(1);
    }

    @Test
    public void 行驶数据发送15分钟以上() throws IOException, InterruptedException {
        int lineIndex = 0;
        List<String> bws = new ArrayList<>();
        List<String> line = FileKit.readLines(new File(行驶url));
        Collections.reverse(line);
        for (String str : line) {
            if (str.indexOf("232302FE") > -1) {
                String bw = str.substring(str.indexOf("\t") + 1).trim().replace("\\t", "");
                bws.add(bw);
            }
        }

        File f = new File("D:/行驶数据发送15分钟以上.log");
        FileKit.deleteFile(f);
        FileKit.createNewFile(f);

        SocketClient client = new ProtocolSocketClient(公司转发网关IP, 公司转发网关端口, f);//往软件公司网关发送

        loginNum = 车辆登入(f, client, loginNum);
        TimeUnit.SECONDS.sleep(10);

        Date endTime = TimeKit.addMinute(new Date(), 16);
        while (true) {
            String timeString = TimeKit.format("yyyyMMddHHmmss", new Date());
            String hexString = bws.get(lineIndex++);
            byte[] bytes = new byte[0];
            byte[] bytes2 = new byte[0];
            报文结构 bw = ProtocolKit.获得报文结构(hexString);

            bytes = ByteKit.byteMerger(bytes, bw.起始符);
            bytes = ByteKit.byteMerger(bytes, 命令标识.实时信息上报);
            bytes = ByteKit.byteMerger(bytes, 应答标识.命令);
            bytes = ByteKit.byteMerger(bytes, ByteKit.hexString2bytes(StringKit.string2hexString(did)));//唯一识别码
            bytes = ByteKit.byteMerger(bytes, bw.数据单元加密方式);
            bytes = ByteKit.byteMerger(bytes, bw.数据单元长度);
            bytes = ByteKit.byteMerger(bytes, ProtocolKit.获得数据采集时间(timeString));
            bytes = ByteKit.byteMerger(bytes, bw.数据单元.实时信息上报.cans);
            bytes = ProtocolKit.BBC(bytes);

            bytes2 = ByteKit.byteMerger(bytes2, bw.起始符);
            bytes2 = ByteKit.byteMerger(bytes2, 命令标识.实时信息上报);
            bytes2 = ByteKit.byteMerger(bytes2, 应答标识.命令);
            bytes2 = ByteKit.byteMerger(bytes2, ByteKit.hexString2bytes(StringKit.string2hexString(vin)));//唯一识别码
            bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元加密方式);
            bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元长度);
            bytes2 = ByteKit.byteMerger(bytes2, ProtocolKit.获得数据采集时间(timeString));
            bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元.实时信息上报.cans);
            bytes2 = ProtocolKit.BBC(bytes2);

            FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [行驶数据] " + StringKit.bytes2hexString(bytes2) + "\r\n");
            client.sendBytes(bytes);
            TimeUnit.SECONDS.sleep(10);
            if (new Date().getTime() >= endTime.getTime()) {
                break;
            }
        }

        loginNum = 车辆登出(f, client, loginNum);
        TimeUnit.SECONDS.sleep(5);

        loginNum++;

    }

    @Test
    public void 充电数据发送15分钟以上() throws IOException, InterruptedException {
        int lineIndex = 0;
        List<String> bws = new ArrayList<>();
        List<String> line = FileKit.readLines(new File(充电url));
        Collections.reverse(line);
        for (String str : line) {
            if (str.indexOf("232302FE") > -1) {
                String bw = str.substring(str.indexOf("\t") + 1).trim().replace("\\t", "");
                bws.add(bw);
            }
        }

        File f = new File("D:/充电数据发送15分钟以上.log");
        FileKit.deleteFile(f);
        FileKit.createNewFile(f);

        SocketClient client = new ProtocolSocketClient(公司转发网关IP, 公司转发网关端口, f);//往软件公司网关发送

        loginNum = 车辆登入(f, client, loginNum);
        TimeUnit.SECONDS.sleep(10);

        Date endTime = TimeKit.addMinute(new Date(), 16);
        while (true) {
            String timeString = TimeKit.format("yyyyMMddHHmmss", new Date());
            String hexString = bws.get(lineIndex++);
            byte[] bytes = new byte[0];
            byte[] bytes2 = new byte[0];
            报文结构 bw = ProtocolKit.获得报文结构(hexString);

            bytes = ByteKit.byteMerger(bytes, bw.起始符);
            bytes = ByteKit.byteMerger(bytes, 命令标识.实时信息上报);
            bytes = ByteKit.byteMerger(bytes, 应答标识.命令);
            bytes = ByteKit.byteMerger(bytes, ByteKit.hexString2bytes(StringKit.string2hexString(did)));//唯一识别码
            bytes = ByteKit.byteMerger(bytes, bw.数据单元加密方式);
            bytes = ByteKit.byteMerger(bytes, bw.数据单元长度);
            bytes = ByteKit.byteMerger(bytes, ProtocolKit.获得数据采集时间(timeString));
            bytes = ByteKit.byteMerger(bytes, bw.数据单元.实时信息上报.cans);
            bytes = ProtocolKit.BBC(bytes);

            bytes2 = ByteKit.byteMerger(bytes2, bw.起始符);
            bytes2 = ByteKit.byteMerger(bytes2, 命令标识.实时信息上报);
            bytes2 = ByteKit.byteMerger(bytes2, 应答标识.命令);
            bytes2 = ByteKit.byteMerger(bytes2, ByteKit.hexString2bytes(StringKit.string2hexString(vin)));//唯一识别码
            bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元加密方式);
            bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元长度);
            bytes2 = ByteKit.byteMerger(bytes2, ProtocolKit.获得数据采集时间(timeString));
            bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元.实时信息上报.cans);
            bytes2 = ProtocolKit.BBC(bytes2);

            FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [充电数据] " + StringKit.bytes2hexString(bytes2) + "\r\n");
            client.sendBytes(bytes);
            TimeUnit.SECONDS.sleep(10);
            if (new Date().getTime() >= endTime.getTime()) {
                break;
            }
        }

        loginNum = 车辆登出(f, client, loginNum);
        TimeUnit.SECONDS.sleep(5);

        loginNum++;

    }

    /**
     * 先发生报警，发送一条报警数据，报警等级为3，假设发生报警时间为10点30分30秒
     * 然后发送报警数据前的30条，1秒1条(补发类型)，依次发送10点30分29秒、28秒、27秒....
     * 然后再发送报警数据后的30条，1秒1条(信息上报类型)，依次发送10点30分31秒、32秒、33秒...
     * 然后再每隔10秒，发送信息上报数据
     */
    @Test
    public void 发送报警数据() throws IOException, InterruptedException {
        List<String> bws = new ArrayList<>();
        List<String> line = FileKit.readLines(new File(报警url));
        Collections.reverse(line);
        for (String str : line) {
            if (str.indexOf("232302FE") > -1 || str.indexOf("232303FE") > -1) {
                String bw = str.substring(str.indexOf("\t") + 1).trim().replace("\\t", "");
                bws.add(bw);
            }
        }

        File f = new File("D:/报警数据.log");
        FileKit.deleteFile(f);
        FileKit.createNewFile(f);

        SocketClient client = new ProtocolSocketClient(公司转发网关IP, 公司转发网关端口, f);//往软件公司网关发送

        loginNum = 车辆登入(f, client, loginNum);
        TimeUnit.SECONDS.sleep(30);

        Date alarmTime = new Date();//记录报警的时间

        int index = 报警(bws, f, client, alarmTime);

        补发报警前30秒(index, bws, f, client, alarmTime);

        index = 报警后30秒(bws, f, client, alarmTime, index);

        再发10次实时(bws, f, client, index);

        loginNum = 车辆登出(f, client, loginNum);
        TimeUnit.SECONDS.sleep(5);

        loginNum++;

    }

    @Test
    public void 发送车辆补发数据() throws IOException, InterruptedException {
        int lineIndex = 0;
        List<String> bws = new ArrayList<>();
        List<String> line = FileKit.readLines(new File(报警url));
        Collections.reverse(line);
        for (String str : line) {
            if (str.indexOf("232303FE") > -1) {
                String bw = str.substring(str.indexOf("\t") + 1).trim().replace("\\t", "");
                bws.add(bw);
            }
        }

        File f = new File("D:/车辆补发.log");
        FileKit.deleteFile(f);
        FileKit.createNewFile(f);

        SocketClient client = new ProtocolSocketClient(公司转发网关IP, 公司转发网关端口, f);//往软件公司网关发送

        loginNum = 车辆登入(f, client, loginNum);
        TimeUnit.SECONDS.sleep(5);

        Date endTime = TimeKit.addMinute(new Date(), 10);
        while (true) {
            String timeString = TimeKit.format("yyyyMMddHHmmss", TimeKit.addMinute(new Date(), -10));
            报文结构 bw = ProtocolKit.获得报文结构(bws.get(lineIndex++));
            byte[] bytes = new byte[0];
            byte[] bytes2 = new byte[0];

            bytes = ByteKit.byteMerger(bytes, bw.起始符);
            bytes = ByteKit.byteMerger(bytes, 命令标识.补发信息上报);
            bytes = ByteKit.byteMerger(bytes, 应答标识.命令);
            bytes = ByteKit.byteMerger(bytes, ByteKit.hexString2bytes(StringKit.string2hexString(did)));//唯一识别码
            bytes = ByteKit.byteMerger(bytes, bw.数据单元加密方式);
            bytes = ByteKit.byteMerger(bytes, bw.数据单元长度);
            bytes = ByteKit.byteMerger(bytes, ProtocolKit.获得数据采集时间(timeString));
            bytes = ByteKit.byteMerger(bytes, bw.数据单元.实时信息上报.cans);
            bytes = ProtocolKit.BBC(bytes);

            bytes2 = ByteKit.byteMerger(bytes2, bw.起始符);
            bytes2 = ByteKit.byteMerger(bytes2, 命令标识.补发信息上报);
            bytes2 = ByteKit.byteMerger(bytes2, 应答标识.命令);
            bytes2 = ByteKit.byteMerger(bytes2, ByteKit.hexString2bytes(StringKit.string2hexString(vin)));//唯一识别码
            bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元加密方式);
            bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元长度);
            bytes2 = ByteKit.byteMerger(bytes2, ProtocolKit.获得数据采集时间(timeString));
            bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元.实时信息上报.cans);
            bytes2 = ProtocolKit.BBC(bytes2);

            FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [车辆补发数据] " + StringKit.bytes2hexString(bytes2) + "\r\n");
            client.sendBytes(bytes);
            if (new Date().getTime() > endTime.getTime()) {
                break;
            }
            TimeUnit.SECONDS.sleep(10);
        }

        TimeUnit.SECONDS.sleep(10);
        loginNum = 车辆登出(f, client, loginNum);
        TimeUnit.SECONDS.sleep(5);

        loginNum++;

        TimeUnit.SECONDS.sleep(1);
    }

    @Test
    public void 发送平台补发数据() throws IOException, InterruptedException {
        int lineIndex = 0;
        List<String> bws = new ArrayList<>();
        List<String> line = FileKit.readLines(new File(报警url));
        Collections.reverse(line);
        for (String str : line) {
            if (str.indexOf("232303FE") > -1) {
                String bw = str.substring(str.indexOf("\t") + 1).trim().replace("\\t", "");
                bws.add(bw);
            }
        }

        File f = new File("D:/平台补发.log");
        FileKit.deleteFile(f);
        FileKit.createNewFile(f);

        SocketClient client = new ProtocolSocketClient(国标网关IP, 国标网关端口, f);//直接往国标网关发送

        loginNum = 平台登入(f, client, loginNum);
        TimeUnit.SECONDS.sleep(5);

        Date endTime = TimeKit.addMinute(new Date(), 10);
        while (true) {
            String timeString = TimeKit.format("yyyyMMddHHmmss", TimeKit.addMinute(new Date(), -10));
            报文结构 bw = ProtocolKit.获得报文结构(bws.get(lineIndex++));
            byte[] bytes = new byte[0];
            bytes = ByteKit.byteMerger(bytes, bw.起始符);
            bytes = ByteKit.byteMerger(bytes, 命令标识.补发信息上报);
            bytes = ByteKit.byteMerger(bytes, 应答标识.命令);
            bytes = ByteKit.byteMerger(bytes, ByteKit.hexString2bytes(StringKit.string2hexString(vin)));//唯一识别码
            bytes = ByteKit.byteMerger(bytes, bw.数据单元加密方式);
            bytes = ByteKit.byteMerger(bytes, bw.数据单元长度);
            bytes = ByteKit.byteMerger(bytes, ProtocolKit.获得数据采集时间(timeString));
            bytes = ByteKit.byteMerger(bytes, bw.数据单元.实时信息上报.cans);
            bytes = ProtocolKit.BBC(bytes);
            FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [平台补发数据] " + StringKit.bytes2hexString(bytes));
            client.sendBytes(bytes);
            if (new Date().getTime() > endTime.getTime()) {
                break;
            }
            TimeUnit.SECONDS.sleep(10);
        }

        TimeUnit.SECONDS.sleep(10);
        loginNum = 平台登出(f, client, loginNum);
        TimeUnit.SECONDS.sleep(5);

        loginNum++;

        TimeUnit.SECONDS.sleep(1);
    }

    private void 再发10次实时(List<String> bws, File f, SocketClient client, int index) throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            String timeString = TimeKit.format("yyyyMMddHHmmss", new Date());
            报文结构 bw = ProtocolKit.获得报文结构(bws.get(++index));
            byte[] bytes = new byte[0];
            byte[] bytes2 = new byte[0];

            bytes = ByteKit.byteMerger(bytes, bw.起始符);
            bytes = ByteKit.byteMerger(bytes, 命令标识.实时信息上报);
            bytes = ByteKit.byteMerger(bytes, 应答标识.命令);
            bytes = ByteKit.byteMerger(bytes, ByteKit.hexString2bytes(StringKit.string2hexString(did)));//唯一识别码
            bytes = ByteKit.byteMerger(bytes, bw.数据单元加密方式);
            bytes = ByteKit.byteMerger(bytes, bw.数据单元长度);
            bytes = ByteKit.byteMerger(bytes, ProtocolKit.获得数据采集时间(timeString));
            bytes = ByteKit.byteMerger(bytes, bw.数据单元.实时信息上报.cans);
            bytes = ProtocolKit.BBC(bytes);

            bytes2 = ByteKit.byteMerger(bytes2, bw.起始符);
            bytes2 = ByteKit.byteMerger(bytes2, 命令标识.实时信息上报);
            bytes2 = ByteKit.byteMerger(bytes2, 应答标识.命令);
            bytes2 = ByteKit.byteMerger(bytes2, ByteKit.hexString2bytes(StringKit.string2hexString(vin)));//唯一识别码
            bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元加密方式);
            bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元长度);
            bytes2 = ByteKit.byteMerger(bytes2, ProtocolKit.获得数据采集时间(timeString));
            bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元.实时信息上报.cans);
            bytes2 = ProtocolKit.BBC(bytes2);

            FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [实时数据] " + StringKit.bytes2hexString(bytes2) + "\r\n");
            client.sendBytes(bytes);
            TimeUnit.SECONDS.sleep(10);
        }
    }

    private int 报警后30秒(List<String> bws, File f, SocketClient client, Date alarmTime, int index) throws InterruptedException {
        for (int i = 0; i < 30; i++) {//发30条实时
            Date time = TimeKit.addSecond(alarmTime, (i + 1));//依次递增的时间
            String timeString = TimeKit.format("yyyyMMddHHmmss", time);
            报文结构 bw = ProtocolKit.获得报文结构(bws.get(++index));
            byte[] bytes = new byte[0];
            byte[] bytes2 = new byte[0];

            bytes = ByteKit.byteMerger(bytes, bw.起始符);
            bytes = ByteKit.byteMerger(bytes, 命令标识.实时信息上报);
            bytes = ByteKit.byteMerger(bytes, 应答标识.命令);
            bytes = ByteKit.byteMerger(bytes, ByteKit.hexString2bytes(StringKit.string2hexString(did)));//唯一识别码
            bytes = ByteKit.byteMerger(bytes, bw.数据单元加密方式);
            bytes = ByteKit.byteMerger(bytes, bw.数据单元长度);
            bytes = ByteKit.byteMerger(bytes, ProtocolKit.获得数据采集时间(timeString));
            bytes = ByteKit.byteMerger(bytes, bw.数据单元.实时信息上报.cans);
            bytes = ProtocolKit.BBC(bytes);

            bytes2 = ByteKit.byteMerger(bytes2, bw.起始符);
            bytes2 = ByteKit.byteMerger(bytes2, 命令标识.实时信息上报);
            bytes2 = ByteKit.byteMerger(bytes2, 应答标识.命令);
            bytes2 = ByteKit.byteMerger(bytes2, ByteKit.hexString2bytes(StringKit.string2hexString(vin)));//唯一识别码
            bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元加密方式);
            bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元长度);
            bytes2 = ByteKit.byteMerger(bytes2, ProtocolKit.获得数据采集时间(timeString));
            bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元.实时信息上报.cans);
            bytes2 = ProtocolKit.BBC(bytes2);

            FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [实时数据] " + StringKit.bytes2hexString(bytes2) + "\r\n");
            client.sendBytes(bytes);
            TimeUnit.SECONDS.sleep(1);
        }
        return index;
    }

    private void 补发报警前30秒(int index, List<String> bws, File f, SocketClient client, Date alarmTime) throws InterruptedException {
        for (int i = 0; i < 30; i++) {//发30条补发
            Date time = TimeKit.addSecond(alarmTime, -(i + 1));//依次递减的时间
            String timeString = TimeKit.format("yyyyMMddHHmmss", time);
            报文结构 bw = ProtocolKit.获得报文结构(bws.get(--index));
            byte[] bytes = new byte[0];
            byte[] bytes2 = new byte[0];

            bytes = ByteKit.byteMerger(bytes, bw.起始符);
            bytes = ByteKit.byteMerger(bytes, 命令标识.补发信息上报);
            bytes = ByteKit.byteMerger(bytes, 应答标识.命令);
            bytes = ByteKit.byteMerger(bytes, ByteKit.hexString2bytes(StringKit.string2hexString(did)));//唯一识别码
            bytes = ByteKit.byteMerger(bytes, bw.数据单元加密方式);
            bytes = ByteKit.byteMerger(bytes, bw.数据单元长度);
            bytes = ByteKit.byteMerger(bytes, ProtocolKit.获得数据采集时间(timeString));
            bytes = ByteKit.byteMerger(bytes, bw.数据单元.实时信息上报.cans);
            bytes = ProtocolKit.BBC(bytes);

            bytes2 = ByteKit.byteMerger(bytes2, bw.起始符);
            bytes2 = ByteKit.byteMerger(bytes2, 命令标识.补发信息上报);
            bytes2 = ByteKit.byteMerger(bytes2, 应答标识.命令);
            bytes2 = ByteKit.byteMerger(bytes2, ByteKit.hexString2bytes(StringKit.string2hexString(vin)));//唯一识别码
            bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元加密方式);
            bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元长度);
            bytes2 = ByteKit.byteMerger(bytes2, ProtocolKit.获得数据采集时间(timeString));
            bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元.实时信息上报.cans);
            bytes2 = ProtocolKit.BBC(bytes2);

            FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [补发数据] " + StringKit.bytes2hexString(bytes2) + "\r\n");
            client.sendBytes(bytes);
            TimeUnit.SECONDS.sleep(1);
        }
    }

    private int 报警(List<String> bws, File f, SocketClient client, Date alarmTime) throws InterruptedException {
        int index = 0;
        String timeString = TimeKit.format("yyyyMMddHHmmss", alarmTime);
        while (true) {
            if (bws.get(index).indexOf("232302FE") > -1 && bws.get(index).indexOf("0703") > -1) {
                break;
            } else {
                index++;
            }
        }
        String hexString = bws.get(index);
        byte[] bytes = new byte[0];
        byte[] bytes2 = new byte[0];
        报文结构 bw = ProtocolKit.获得报文结构(hexString);

        bytes = ByteKit.byteMerger(bytes, bw.起始符);
        bytes = ByteKit.byteMerger(bytes, 命令标识.实时信息上报);
        bytes = ByteKit.byteMerger(bytes, 应答标识.命令);
        bytes = ByteKit.byteMerger(bytes, ByteKit.hexString2bytes(StringKit.string2hexString(did)));//唯一识别码
        bytes = ByteKit.byteMerger(bytes, bw.数据单元加密方式);
        bytes = ByteKit.byteMerger(bytes, bw.数据单元长度);
        bytes = ByteKit.byteMerger(bytes, ProtocolKit.获得数据采集时间(timeString));
        bytes = ByteKit.byteMerger(bytes, bw.数据单元.实时信息上报.cans);
        bytes = ProtocolKit.BBC(bytes);

        bytes2 = ByteKit.byteMerger(bytes2, bw.起始符);
        bytes2 = ByteKit.byteMerger(bytes2, 命令标识.实时信息上报);
        bytes2 = ByteKit.byteMerger(bytes2, 应答标识.命令);
        bytes2 = ByteKit.byteMerger(bytes2, ByteKit.hexString2bytes(StringKit.string2hexString(vin)));//唯一识别码
        bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元加密方式);
        bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元长度);
        bytes2 = ByteKit.byteMerger(bytes2, ProtocolKit.获得数据采集时间(timeString));
        bytes2 = ByteKit.byteMerger(bytes2, bw.数据单元.实时信息上报.cans);
        bytes2 = ProtocolKit.BBC(bytes2);

        FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [报警数据] " + StringKit.bytes2hexString(bytes2) + "\r\n");
        client.sendBytes(bytes);
        TimeUnit.SECONDS.sleep(1);
        return index;
    }

    private int 平台登出(File f, SocketClient client, int loginNum) {
        byte[] bytes;
        bytes = ProtocolKit.平台登出(TimeKit.format("yyyyMMddHHmmss", new Date()), loginNum);
        FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [平台登出] " + StringKit.bytes2hexString(bytes));
        client.sendBytes(bytes);
        return loginNum;
    }

    private int 平台登入(File f, SocketClient client, int loginNum) {
        byte[] bytes;
        bytes = ProtocolKit.平台登入(TimeKit.format("yyyyMMddHHmmss", new Date()), loginNum, loginName, loginPassword);
        FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [平台登入] " + StringKit.bytes2hexString(bytes));
        client.sendBytes(bytes);
        return loginNum;
    }

    private int 车辆登出(File f, SocketClient client, int loginNum) {
        byte[] bytes, bytes2;
        bytes = ProtocolKit.车辆登出(did, TimeKit.format("yyyyMMddHHmmss", new Date()), loginNum);
        bytes2 = ProtocolKit.车辆登出(vin, TimeKit.format("yyyyMMddHHmmss", new Date()), loginNum);//因为要记录的是VIN
        FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [车辆登出] " + StringKit.bytes2hexString(bytes2));
        client.sendBytes(bytes);
        return loginNum;
    }

    private int 车辆登入(File f, SocketClient client, int loginNum) {
        byte[] bytes, bytes2;
        Date d = new Date();
        bytes = ProtocolKit.车辆登入(did, TimeKit.format("yyyyMMddHHmmss", d), loginNum, ICCID, 0, 0);
        bytes2 = ProtocolKit.车辆登入(vin, TimeKit.format("yyyyMMddHHmmss", d), loginNum, ICCID, 0, 0);//因为要记录的是VIN
        FileKit.appendContentAndRN(f, "[" + TimeKit.format("yyyy-MM-dd HH:mm:ss", new Date()) + "] [车辆登入] " + StringKit.bytes2hexString(bytes2));
        client.sendBytes(bytes);
        return loginNum;
    }

}
